<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
    </head>
    <body>
        <script>
            // console.log('script start');

            // setTimeout(() => {
            //     console.log('setTimeout')
            // }, 0);

            // async();

            // new Promise((resolve) => {
            //     console.log('promise1');
            //     resolve();
            // }).then(() => {
            //     console.log("promise2");
            // }).then(() => {
            //     console.log("promise2_then")
            // });

            //Eventloop事件循环
            //由于js的执行机制是单线程的，所以分为同步任务和异步任务，异步任务又分为宏任务和微任务
            //1.执行同步任务console.log('script start')
            //2.执行同步任务console.log('promise1')
            //3.执行异步任务，异步任务中首先执行微任务，其次是宏任务.
            //4.执行异步任务中的微任务，console.log('promise2')
            //5.执行异步任务中的微任务，console.log('promise2_then')
            //6.执行异步任务中中的宏任务setTimeout,console.log('setTimeout')

            // 实现一个方法类似promise.all方法接收一个数组返回一个promise对象，
            // 数组里面都是promise对象，然后接收所有的结果，都成功返回所有的成功结果（数组形式），
            // 只要有一个失败就返回失败（rejected）

            // let promise1 = new Promise(function(resolve) {
            //     resolve(1);
            // });
            // let promise2 = new Promise(function(resolve) {
            //     resolve(2);
            // });
            // let promise3 = new Promise(function(resolve) {
            //     resolve(3);
            // });

            // let promiseAll = Promise.all([promise1, promise2, promise3]);

            // promiseAll.then(function(res) {
            //     console.log(res);
            // });

            function PromiseAll(promise) {
                let result = [];
                let promiseLength = 0;
                let promiseCount = 0;
                return new Promise((resolve, reject) => {
                    for (let val of promise) {
                        //console.log(3)
                        //console.log(result)
                        Promise.resolve(val).then(
                            function (res) {
                                //console.log(res)
                                promiseCount++;
                                //console.log(promiseCount)
                                result.push(res); //d打印值
                                console.log(result);
                                if (promiseCount === promiseLength) {
                                    console.log(result);
                                    return resolve(res);
                                }
                            },
                            function (error) {
                                return reject(error);
                            }
                        );
                    }
                });
            }
            PromiseAll([4, 5, 6]);
        </script>
    </body>
</html>
